package health_system.health_system.repository;


import health_system.health_system.entity.LoginRecord;
import health_system.health_system.entity.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 登录记录Repository接口
 */
@Repository
public interface LoginRecordRepository extends JpaRepository<LoginRecord, Long> {
    
    /**
     * 根据用户ID查询登录记录，按登录时间降序排序
     *
     * @param userId 用户ID
     * @param pageable 分页参数
     * @return 分页的登录记录
     */
    Page<LoginRecord> findByUserIdOrderByLoginTimeDesc(Long userId, Pageable pageable);
    
    /**
     * 查询用户的最近N条登录记录
     *
     * @param user 用户对象
     * @param limit 限制数量
     * @return 最近的N条登录记录
     */
    @Query("SELECT lr FROM LoginRecord lr WHERE lr.user = :user ORDER BY lr.loginTime DESC")
    List<LoginRecord> findRecentLoginsByUser(@Param("user") User user, Pageable pageable);
    
    /**
     * 查询用户在指定时间范围内的登录记录
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByUserIdAndLoginTimeBetweenOrderByLoginTimeDesc(
            Long userId, LocalDateTime startTime, LocalDateTime endTime, Pageable pageable);
    
    /**
     * 查询指定IP地址的登录记录
     *
     * @param ipAddress IP地址
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByIpAddressOrderByLoginTimeDesc(String ipAddress, Pageable pageable);
    
    /**
     * 根据登录状态查询记录
     *
     * @param loginStatus 登录状态
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByLoginStatusOrderByLoginTimeDesc(
            LoginRecord.LoginStatus loginStatus, Pageable pageable);
    
    /**
     * 查询用户最近一次登录记录
     *
     * @param userId 用户ID
     * @return 最近一次登录记录
     */
    @Query("SELECT lr FROM LoginRecord lr WHERE lr.user.id = :userId AND lr.loginStatus = 'SUCCESS' ORDER BY lr.loginTime DESC")
    List<LoginRecord> findLastSuccessfulLogin(@Param("userId") Long userId, Pageable pageable);
    
    /**
     * 统计用户登录失败次数
     *
     * @param userId 用户ID
     * @param startTime 开始时间
     * @return 登录失败次数
     */
    @Query("SELECT COUNT(lr) FROM LoginRecord lr WHERE lr.user.id = :userId AND lr.loginStatus = 'FAILED' AND lr.loginTime >= :startTime")
    long countFailedLoginAttempts(@Param("userId") Long userId, @Param("startTime") LocalDateTime startTime);
    
    /**
     * 按设备类型查询登录记录
     *
     * @param deviceType 设备类型
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByDeviceTypeOrderByLoginTimeDesc(
            LoginRecord.DeviceType deviceType, Pageable pageable);
    
    /**
     * 查询某个位置的登录记录
     *
     * @param location 位置信息
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByLocationContainingIgnoreCaseOrderByLoginTimeDesc(
            String location, Pageable pageable);
    
    /**
     * 查询用户在特定设备上的登录记录
     * 
     * @param userId 用户ID
     * @param deviceName 设备名称
     * @param pageable 分页参数
     * @return 符合条件的登录记录
     */
    Page<LoginRecord> findByUserIdAndDeviceNameContainingIgnoreCaseOrderByLoginTimeDesc(
            Long userId, String deviceName, Pageable pageable);
} 